//package com.zjm.lock.cdl;
//
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.atomic.AtomicInteger;
//
///**
// * CountDownLatch: 倒计数器
// * 创建对象时，传入指定数值作为线程参与的数量
// * await: 方法等到计数器值变为0，在这之前，线程进入等待状态
// * countdown: 计数器值减一，直到为0;
// * 经常用于等待其他线程执行到某一节点，再继续执行当前线程代码
// * 使用场景示例：
// * 1.统计线程执行的情况；
// * 2.压力测试中，使用countDownLatch实现最大程度的并发处理；
// * 3.多个线程之间，相互通信，比如线程异步调用完接口，结果通知；
// */
//public class CdlUseCase {
//    public static void main(String[] args) throws InterruptedException {
//        test1();
//        test2();
//    }
//
//    /**
//     * 不同的场景，不同的使用形式：
//     * 10个子线程都在等待主线程的"信号"，一旦主线程发出信号，10个子线程就会并发执行
//     * @throws InterruptedException
//     */
//    static void test1() throws InterruptedException {
//        CountDownLatch cdl = new CountDownLatch(1);
//        for (int i = 0; i < 10; i++) {
//            Thread t = new Thread(()->{
//                System.out.println("各就各位");
//                try {
//                    cdl.await();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println("跑");
//            });
//            t.start();
//        }
//        // 停止0.5秒保证所有子线程都进入Runnable状态
//        Thread.sleep(500);
//        cdl.countDown();
//    }
//
//    /**
//     * 不同的场景，不同的使用形式:
//     * 主线程等待其他10个子线程运行完毕，然后汇总结果
//     * @throws InterruptedException
//     */
//    static void test2() throws InterruptedException {
//        AtomicInteger sum = new AtomicInteger();
//        CountDownLatch cdl = new CountDownLatch(10);
//        for (int i = 0; i < 10; i++) {
//            Thread t = new Thread(()->{
//                for (int j = 0; j < 1000; j++) {
//                    sum.incrementAndGet();
//                }
//                cdl.countDown();
//            });
//            t.start();
//        }
//        cdl.await();
//        System.out.println("sum: " + sum);
//    }
//}
